package Server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

import common.ClientInterface;

/**
 * 
 * 
 * 
 * @author Jacopo Ferrigno
 *
 */

public class SocketGame extends Thread implements ClientInterface {

	private ArrayList<SocketClient> listaConnessioni;
	
	//socketServer per gestire connessioni, socketClient, per ogni singolo client
	private ServerSocket mainSocket;
	private Socket clientSocket;
	private int port;
	public static final int PORT=2000;
	
	
	
	/**
	 * Costruttore di default, se usato il server ascoltera' sulla porta di default(2000)
	 * Andra' poi richiamato il metodo listen() per far parire il server in ascolto
	 * 
	 * @throws IOException
	 */
	
	
	public SocketGame() throws IOException {
						
		super("SocketGame");
		this.port=SocketGame.PORT;
		this.listaConnessioni=new ArrayList<SocketClient>();
		
		try{
			this.mainSocket=new ServerSocket(this.port);
		} catch (Exception e){
			this.mainSocket.close();
		}
		
		
		/*
		 * controllare se il server non parte
		 */
		this.start();
	}
	/**
	 * Costruttore ad un parametro, se usato il server ascoltera' sulla porta specificata come parametro
	 * Andra' poi richiamato il metodo listen() per far parire il server in ascolto
	 * 
	 * 
	 * @param port porta su cui mettersi in ascolto
	 * @throws IOException
	 */
	
	public SocketGame(int port) throws IOException{
		this.port=port;
		
		this.mainSocket=new ServerSocket(this.port);
		this.listaConnessioni=new ArrayList<SocketClient>();
		
		/*
		 * controllare se il server non parte
		 */
		this.start();
	}	
	

	/**
	 * Metodo per notificare a tuttu i client che e' cambiato il tuorno.
	 * 
	 * @param newUser Nome utente di chi detiene il turno
	 */
	@Override
	public void notifyTurn(String newUser) {
	
		for(SocketClient Client:this.listaConnessioni){
			//Magari la listaConnessioni non e' aggiornata e un client non e' piu' connesso, skippalo
			if(Client.isAlive())
					Client.notifyTurn(newUser);
			else
				this.listaConnessioni.remove(Client);
			
		}
		
		
	}
	
	/**
	 * Il metodo run() invocato da listen() e' perennemente in un ciclo:
	 * Accetta una nuova connessione,
	 * controlla che tutti i client che sono in lista siano ancora connessi
	 * 
	 */
	
	public void run(){
		
		while(true){
			try{
							
				this.clientSocket=this.mainSocket.accept();
				this.listaConnessioni.add(new SocketClient(this.clientSocket));
				//Momento,momento,momento,momento,momento,momento,momento,momento, questo client si e' disconnesso
				for(SocketClient Client:this.listaConnessioni){
					if(!Client.isAlive())
						this.listaConnessioni.remove(Client);
				}
			}catch (IOException e) {
				throw new RuntimeException(e);
			}
				
		}
		
		
	}
}
